Exceptions in gRPC
Throwing exceptions
Any ASP.NET Core gRPC service can send an error response by throwing an RpcException, which can be caught by the client as if it were in the same process. The RpcException must include a status code and description, and can optionally include metadata and a longer exception message. The metadata can be used to send additional data.
Throwing an exception example
...
var metadata = new Metadata { { "User", user.Identity.Name } };
throw new RpcException(new Status(StatusCode.PermissionDenied, "Permission denied"), metadata);
...
Catching exceptions
Catching an exception
try {
var result = await client.MyMethod(new GetPortfolioRequest { Id = id });
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.PermissionDenied)
{
var userEntry = ex.Trailers.FirstOrDefault(e => e.Key == "User");
Console.WriteLine($"User '{userEntry.Value}' does not have permission to view this.");
}
catch (RpcException)
{
//other ex type
}
title
When you provide additional metadata for errors, be sure to document the relevant keys and values in your API documentation, or in comments in your .proto file.